#include "tools.h"

//注意：从id.dat配置文件中读取上次生成的ID号，将其加1后重新写入，同时返回新生成的ID号
//生成唯一的管理员ID号
int generator_MgrId(const char* path)
{
	int id = 0;
	
	int fd = open(path,O_RDWR);
	if(ERROR == fd)
	{
		perror("open");
		return -1;
	}

	if(0 >= read(fd,&id,sizeof(id)))
	{
		perror("read");
		return -1;
	}

	id++;	

	lseek(fd,SEEK_SET,0);

	if(0 >= write(fd,&id,sizeof(id)))
	{
		perror("write");
		return -1;
	}

	close(fd);
	
	return id - 1;

}

//生成唯一的部门ID号
int generator_DeptId(const char* path)
{
	int id = 0;
	
	int fd = open(path,O_RDWR);
	if(ERROR == fd)
	{
		perror("open");
		return -1;
	}

	if(0 >= read(fd,&id,sizeof(id)))
	{
		perror("read");
		return -1;
	}

	id++;	

	lseek(fd,SEEK_SET,0);

	if(0 >= write(fd,&id,sizeof(id)))
	{
		perror("write");
		return -1;
	}

	close(fd);
	
	return id - 1;

}

//生成唯一的员工ID号
int generator_EmpId(const char* path)
{
	int id = 0;
	
	int fd = open(path,O_RDWR);
	if(ERROR == fd)
	{
		perror("open");
		return -1;
	}

	if(0 >= read(fd,&id,sizeof(id)))
	{
		perror("read");
		return -1;
	}

	id++;	

	lseek(fd,SEEK_SET,0);

	if(0 >= write(fd,&id,sizeof(id)))
	{
		perror("write");
		return -1;
	}

	close(fd);
	
	return id - 1;

}

//清理输入缓冲区
void clear_stdin(void)
{
	stdin->_IO_read_ptr = stdin->_IO_read_end;
}

//输入任意键继续
void anykey_continue(void)
{
	printf("请输入任意键继续...");
	get_keyboard();
	printf("\n");
}

// 初始化id文件
int init_id(const char* path,int id)
{
	//测试是否存在 F_OK 
	if(OK == access(path,F_OK))
	{
		return 0;
	}
	//如果不存在 则创建
	int fd = open(path,O_WRONLY | O_CREAT | O_TRUNC,0644);
	if(ERROR == fd)
	{
		perror("open");
		return -1;
	}
	//"account/id.dat" 写入201808000
	if(0 >= write(fd,&id,sizeof(id)))
	{
		perror("error");
		return -1;
	}

	close(fd);

	return 0;
}


//此函数能立即从键盘不回显的接收数据
int32_t get_keyboard(void)
{
	//接收系统调用的执行结果
	int32_t ret = 0;
	//存储终端设备的配置信息
	struct termios old;
	
	//通过系统调用获取终端的配置信息
	ret=tcgetattr(STDIN_FILENO,&old);
	if(0 > ret)
	{
		perror("tcgetattr");
		return -1;
	}
	
	//初始化新的终端配置信息
	struct termios news = old;
	//取消回显并立即获取
	news.c_lflag &= ~(ICANON|ECHO);
	
	//设置新的终端配置信息
	ret= tcsetattr(STDIN_FILENO,TCSANOW,&news);
	if(0 > ret)
	{
		perror("tcsetattr");
		return -2;
	}
	
	//在新的模式下从终端获取数据
	int32_t key_value = 0;
	do{
		key_value += getchar();
	}while(stdin->_IO_read_end - stdin->_IO_read_ptr);
	
	//还原终端的配置信息
	ret = tcsetattr(STDIN_FILENO,TCSANOW,&old);
	if(0 > ret)
	{
		perror("tcsetattr");
		return -3;
	}

	//返回获取到的数据
	return key_value;
}
